//#define BUILD_MYDLL
//#include "pch.h"
#include <stdio.h>
//#include "mydll.h"
#include <iostream>

using namespace std;

int convert_array(int* data, int len)
{
	for (int i = 0; i < len; i++) {
		cout << data[i] << ",";
	}

	return int();
}

#include <stdlib.h>

#define MaxSize 100  //定义顺序表中的元素个数
using namespace std;

typedef struct {
	ElemType data[MaxSize];//存放线性表中的元素
	int length;//存放线性表的长度
}SqList;//顺序表类型

typedef int ElemType;//定义类型为整型

//采用SqList类型的变量存储一个集合
void creatSqList(SqList& s, int a[], int n)//创建一个集合
{
	int i;
	for (i = 0; i < n; i++)
		s.data[i] = a[i];
	s.length = n;
}

void dispSqList(SqList s)//输出一个集合
{
	int i;
	for (i = 0; i < s.length; i++)
		cout << (int)s.data[i] << endl;
	cout << endl;
}

bool inSqList(SqList s, int e)//判断e是否在集合s中
{
	int i;
	for (i = 0; i < s.length; i++)
		if (s.data[i] == e)
			return true;
	return false;
}

void addSqList(SqList s1, SqList s2, SqList& s3)//求集合的并集
{
	int i;
	for (i = 0; i < s1.length; i++)//将集合s1的所有元素复制到s3中
		s3.data[i] = s1.data[i];
	s3.length = s1.length;
	for (i = 0; i < s2.length; i++)//将s2中不在s1中出现的元素复制到s3中
		if (!inSqList(s1, s2.data[i])) {
			s3.data[s3.length] = s2.data[i];
			s3.length++;
		}
}

void subSqList(SqList s1, SqList s2, SqList& s3)//求集合的差集
{
	int i;
	s3.length = 0;
	for (i = 0; i < s1.length; i++)//将s1中不出现在s2中的元素复制到s3
		if (!inSqList(s2, s1.data[i])) {
			s3.data[s3.length] = s1.data[i];
			s3.length++;
		}
}

void intersection(SqList s1, SqList s2, SqList& s3)//求集合的交集
{
	int i;
	s3.length = 0;
	for (i = 0; i < s1.length; i++)//将s1中出现在s2中的元素复制到s3中
		if (inSqList(s2, s1.data[i])) {
			s3.data[s3.length] = s1.data[i];
			s3.length++;
		}
}

//建立顺序表
void CreateList(SqList*& L, ElemType a[], int n)
{
	int i = 0, k = 0;
	L = (SqList*)malloc(sizeof(SqList));
	while (i < n)
	{
		L->data[k] = a[i];
		k++; i++;
	}
	L->length = k;
}

//初始化线性表InitList(&L)
void InitList(SqList*& L)
{
	L = (SqList*)malloc(sizeof(SqList));//分配存放线性表的空间
	L->length = 0;//置空线性表的长度为0
}

//销毁线性表DestroyList(&L)
void DestroyList(SqList*& L)
{
	free(L);//释放L所指的顺序表空间
}

//判断线性表是否为空表ListEmpty(L)
bool ListEmpty(SqList* L)
{
	return (L->length == 0);
}

//求线性表的长度ListLength(L)
int ListLength(SqList* L)
{
	return(L->length);
}

//输出线性表DispList(L)
void DispList(SqList* L)
{
	for (int i = 0; i < L->length; i++)//扫描顺序表输出各元素值
		cout << (int)L->data[i] << endl;
}

//求线性表中的某个数据元素值GetElem(L, i, &e)
bool GetElem(SqList* L, int i, ElemType& e)
{
	if (i < 1 || i > L->length)
		return false;//参数i错误时返回false
	e = L->data[i - 1];//取元素值，返回L中第i（1≤i≤n）个元素
	return true;//成功找到元素时返回true
}

//按元素值查找LocateElem(L, e)
int LocateElem(SqList* L, ElemType e)
{
	int i = 0;
	while (i < L->length&& L->data[i] != e)
		i++;//查找元素e
	if (i >= L->length)
		return 0;//未找到时返回0
	else
		return i + 1;//找到后返回其逻辑序号
}

//插入数据元素ListInsert(&L, i, e)
bool ListInsert(SqList*& L, int i, ElemType e)
{
	int j;
	if (i < 1 || i > L->length + 1 || L->length == MaxSize)
		return false;//参数i错误时返回false
	i--;//将顺序表逻辑符号转化为物理序号
	for (j = L->length; j > i; j--)//将data[i]及后面的元素后移一个位置
		L->data[j] = L->data[j - 1];
	L->data[i] = e;//插入元素e
	L->length++;//顺序表长度增1
	return true;//成功插入返回true
}

//删除数据元素ListDelete(&L, i, &e)
bool ListDelete(SqList*& L, int i, ElemType& e)
{
	int j;
	if (i < 1 || i > L->length)//参数i错误时返回true
		return false;
	i--;//将顺序表逻辑序号转化为物理序号
	e = L->data[i];
	for (j = i; j < L->length - 1; j++)//将data[i]之后的元素前移一个位置
		L->data[j] = L->data[j + 1];
	L->length--;//顺序表的长度-1
	return true;//成功删除返回true
}
